
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Spring 事务传播行为的作用？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Spring 事务传播行为的作用？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Spring事务传播行为在框架中扮演了哪些关键角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring事务传播行为主要有三大作用：1. 定义事务边界，决定方法调用时是使用现有事务还是创建新事务；2. 确保数据一致性，保证业务操作中的所有数据变化要么全部成功，要么全部回滚；3. 提高事务的灵活性，允许开发者根据具体业务需求灵活配置事务。</div>
          </div>
          <div class="card-source">来源: 事务传播行为的作用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在Spring中，默认的事务传播行为是什么？它的具体规则是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring中默认的事务传播行为是 REQUIRED。其规则是：如果当前存在一个事务，那么该方法就会加入到这个事务中执行；如果当前不存在事务，则会创建一个新的事务。</div>
          </div>
          <div class="card-source">来源: Spring 提供的事务传播行为 - 1. REQUIRED（默认）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">请比较 `REQUIRES_NEW` 和 `REQUIRED` 两种传播行为在处理已存在事务时的核心区别。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">核心区别在于 `REQUIRES_NEW` 总是会创建一个全新的、独立的事务。如果当前已经存在一个事务，它会先将当前事务挂起，然后执行新事务，待新事务完成后再恢复外部事务。而 `REQUIRED` 则是如果存在当前事务，会直接加入其中，不会创建新事务。</div>
          </div>
          <div class="card-source">来源: Spring 提供的事务传播行为 - 1. REQUIRED（默认） 和 2. REQUIRES_NEW</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当事务传播行为设置为 `NESTED` 时，它如何实现部分回滚？其内部机制是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当设置为 `NESTED` 且当前存在事务时，它会在当前事务中创建一个嵌套事务。这种嵌套事务通常通过数据库的保存点（savepoint）机制实现。如果嵌套事务失败，只有该嵌套事务（即从保存点之后的操作）会回滚，而外部事务不会受到影响，从而实现了部分回滚。</div>
          </div>
          <div class="card-source">来源: Spring 提供的事务传播行为 - 3. NESTED</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">`MANDATORY` 传播行为对调用环境有什么强制性要求？违反该要求会导致什么后果？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`MANDATORY` 传播行为强制要求方法必须在一个已存在的事务中执行。如果调用时没有事务，它会直接抛出异常。</div>
          </div>
          <div class="card-source">来源: Spring 提供的事务传播行为 - 6. MANDATORY</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">哪种传播行为明确规定其修饰的方法绝不能在事务中运行？如果在事务中调用它会发生什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`NEVER` 传播行为规定其修饰的方法必须以非事务方式执行。如果当前存在事务，调用该方法会直接抛出异常。</div>
          </div>
          <div class="card-source">来源: Spring 提供的事务传播行为 - 7. NEVER</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
